package com.lyxs916.testlibrary.rxjavatest.retrofittext.bean;


import com.lyxs916.testlibrary.rxjavatest.retrofittext.TRetrofitTest;

import java.util.Map;

import okhttp3.RequestBody;
import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.Field;
import retrofit2.http.FieldMap;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.Headers;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;
import retrofit2.http.Path;
import retrofit2.http.Query;
import retrofit2.http.QueryMap;
import rx.Observable;

/**
 * Created by Administrator on 2017-06-05.
 */

public interface TApiService {
    /**
     * 参数与Url里
     */
    @GET("geocoding?a=上海市&aa=松江区&aaa=车墩镇")
    Call<TAliAddrsBean> getIndexContent();

    /**
     * 带参数
     */
    @POST("geocoding?")
    Call<TAliAddrsBean> getIndexContentTow(
            @Query("a") String key1,
            @Query("aa") String key2,
            @Query("aaa") String key3
    );

    /**
     * map请求方式
     */
    @GET("geocoding?")
    Call<TAliAddrsBean> getIndexContentThree(
            @QueryMap Map<String, Object> options
    );


    /**
     * 通过@Body注解指定一个对象作为Http请求的请求体（类似于一二三级城市的参数都放在的请求体indexRequestBean里面）
     */
    @POST("geocoding?")
    Call<TAliAddrsBean> getIndexContentFour(
            @Body TIndexRequestBean indexRequestBean);


    /**
     * @FormUrlEncoded 和@Field 发送表单数据
     */
    //函数也可以声明为发送form-encoded（表单形式）和multipart（多部分）数据。
    //当函数有@FormUrlEncoded注解的时候，将会发送form-encoded数据，
    //每个键-值对都要被含有名字的@Field注解和提供值的对象所标注(这他妈是绕口令吗？)
    //每个键值对的写法都是用注解@field标识的，表单形式的数据
    @FormUrlEncoded
    @POST("geocoding?")
    Call<TAliAddrsBean> getIndexContentFive(
            @Field("a") String city,
            @Field("aa") String citys,
            @Field("aaa") String cityss
    );

    /**
     * @Multipart和@Part 发送字节流数据
     */
    //当函数有@Multipart注解的时候，将会发送multipart数据，
    // Parts都使用@Part注解进行声明
    //Multipart parts要使用Retrofit的众多转换器之一或者实现RequestBody来处理自己的序列化。
    //这个可以用于传文件,可以改变传值的编码，默认utf_8
    @Multipart
    @POST("geocoding?")
    Call<TAliAddrsBean> getIndexContentSix(
            @Part("a") RequestBody city,
            @Part("aa") RequestBody citya,
            @Part("aaa") RequestBody cityaa);


    /**
     * 可以使用@Headers注解给函数设置静态的header
     */
    @Headers({"key:" + TRetrofitTest.aa, "web_vsersion:2222222222", "app_version:333333333333"})
    @POST("geocoding?")
    Call<TAliAddrsBean> getIndexContentSeven(
            @QueryMap Map<String, Object> options
    );

    /**
     * @Header 单个参数的header
     */
    //可以使用@Header注解动态的更新一个请求的header。必须给@Header提供相应的参数，
    //如果参数的值为空header将会被忽略，否则就调用参数值的toString()方法并使用返回结果
    @GET("geocoding?")
    Call<TAliAddrsBean> getIndexContentNine(
            @Header("key") String city,
            @QueryMap Map<String, Object> options
    );


    //我们适配Rxjava的时候，只需要将返回结果的call变成Rxjava的被订阅者Observable即可
    @GET("geocoding?")
    Observable<TAliAddrsBean> getIndexContentEleven(
            @Query("a") String city);





    /**
     * **
     * 创建时间: 2016/9/24 16:12
     * <p>
     * 方法功能：post请求
     *
     * @param maps : 不一定要传Action
     *                @POST("{path}")
     *                @POST("geocoding?")
     */
    @FormUrlEncoded
    @POST("{path}")
    Observable<TAliAddrsBean> executePost(
            @Path(value = "path", encoded = true) String path,
            @FieldMap Map<String, String> maps
    );

    @GET("{path}")
    Observable<TAliAddrsBean> executeGet(
            @Path(value = "path", encoded = true) String path,
            @QueryMap Map<String, String> maps);


}
